﻿package net.molchat.android.media;


import net.molchat.android.R;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;


// ==================================================================== Картинка
/**
 * Базовый класс для статических и анимированных картинок.<br />
 */
public class Pic extends Resource {

// =================================================================== Константы


// ================================================================== Переменные
public int w; // Ширина
public int h; // Высота

public Bitmap img; // Картинка

public String alt; // Текстовый эквивалент

public byte[] seq; // Анимационная последовательность
private byte delay; // Сколько еще кадров демонстрировать текущий кадр
private byte frameP = -1; // Указатель на извлекаемый элемент информации о кадре
private int lastFrame = -1; // Условный номер при последнем вызове

public int drawY; // Верхний левый угол отрисовываемой части картинки (X всегда =0)


// ================================================================= Конструктор
// Пустой
public Pic() {

}


// Статический
// TODO Deprecated. Use ResLoader.load() instead
@Deprecated
public Pic(String alt, String file) {

	this.type = Resource.TYPE_PIC_STATIC;
	//	this.id = id;
	this.alt = alt;

	try {
		// FIXME conversion should be created from "file" to resource constant
		img = BitmapFactory.decodeResource(ResMan.resources, R.drawable.zz);

		this.w = img.getWidth();
		this.h = img.getHeight();

	} catch (Exception e) {
		Log.e("Smile.loadSprite: CAN'T create a sprite", "unexpected", e);
	}
}


// Анимированный
// TODO Deprecated. Use ResMan.load() instead
@Deprecated
public Pic(String alt, String file, int w, int h, byte[] seq) {

	this.type = Resource.TYPE_PIC_ANI;
	//	this.id = id;
	this.alt = alt;

	try {
		// FIXME conversion should be created from "file" to resource constant
		img = BitmapFactory.decodeResource(ResMan.resources, R.drawable.zz);

		this.w = w;
		this.h = h;

		this.seq = seq;

		nextFrame(0);

	} catch (Exception e) {
		Log.e("Pic.init", "Не удалось загрузить картинку", e);
	}
}


// ================================================================== Отрисовать
public void draw(Canvas g, int posX, int posY) {

	// posX, posY передают левый верхний угол
	if (this.type == Resource.TYPE_PIC_ANI) { // Смайл анимирован
		g.drawBitmap(img, new Rect(0, drawY, w, h), new Rect(posX, posY, w, h),
				null);
	} else { // Статичный
		g.drawBitmap(img, posX, posY, null);
	}

}


// ============================================================== Следующий кадр
public boolean nextFrame(int frame) {

	boolean fNew = false;

	if (this.lastFrame != frame) {
		if (--delay <= 0) {
			if (++frameP >= seq.length) {
				this.frameP = 0;
			}
			drawY = seq[this.frameP] * h;
			if (drawY >= this.img.getHeight()) {
				Log.v("Pic.nextFrame", "Подозрительно большая высота");
			}
			this.delay = this.seq[++this.frameP];
			fNew = true;
		}
		this.lastFrame = frame;
	}

	return fNew;
}


//================================================================ Сериализовать
@Override
public byte[] toBytes() {

	// TODO Auto-generated method stub
	return null;
}


//============================================================== Десериализовать
@Override
public void fromBytes(byte[] bytes) {

	// TODO Auto-generated method stub

}


}
